import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 1、初始化CyclicBarrier
 * 2、在CyclicBarrier中，所有的线程调用await方法，等待其他线程都执行完成
 * 
 * 适用场景：
 * 1、所有的线程调用await方法，等待其他线程都执行完
 * 
 * 总结：
 * CyclicBarrier就是一个栅栏，等待所有线程到达后再执行相关的操作。barrier 在释放等待线程后可以重用。 
 * 
 * @author 10255_000
 *
 */

public class TestCyclicBarrier {
	public static void main(String[] args) {  
        ExecutorService exec = Executors.newCachedThreadPool();    
        
        
        final Random random=new Random();  
          
        final CyclicBarrier barrier=new CyclicBarrier(4,new Runnable(){  
            @Override  
            public void run() {  
                System.out.println("所有的进程数目都齐备了，准备一起做了！");  
            }});  
          
        for(int i=0;i<8;i++){  
            exec.execute(new Runnable(){  
                @Override  
                public void run() {  
                    try {  
                        Thread.sleep(random.nextInt(1000));  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                    System.out.println(Thread.currentThread().getName()+"进入了");  
                    try {  
                        barrier.await();//达到指定数目的barrier后，调用barrier中的run方法
                        System.out.println(Thread.currentThread().getName()+"开始做自己的事情了");  
                        
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    } catch (BrokenBarrierException e) {  
                        e.printStackTrace();  
                    }  
                }});  
        }  
        exec.shutdown();  
    }  
}